package Regex;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import main.Interruptible;

public class RegexSolver implements Runnable 
{
	//In this class the Java regex engine is used to solve the membership problem
	private PrintWriter writer;
	private boolean interrupted = false;
	private ArrayList<String[]> instances;
	private Pattern regexPattern;
	private Matcher regexMatcher;
	private boolean isMember;
	
	public boolean isMember() {
		return isMember;
	}

	public boolean isInterrupted() {
		return interrupted;
	}

	public void setInterrupted(boolean interrupted) {
		this.interrupted = interrupted;
	}

	public void interrupt() {
		interrupted = true;
	}

	public void setWriter(PrintWriter writer) {
		this.writer = writer;
	}

	public RegexSolver() {

	}

	public synchronized void stop() {
		if (this != null) {
			this.stop();
		}
	}

	public void setInstance(Pattern regexPattern_, Matcher regexMatcher_) 
	{
		regexPattern = regexPattern_;
		regexMatcher = regexMatcher_;
	}

	public boolean solveInstance(Pattern regexPattern, Matcher regexMatcher) {
		return regexMatcher.find();
	}

	public void solve() 
	{
		//This function uses the Java regex engine to solve the instance
		double firstTimeStamp = Calendar.getInstance().getTimeInMillis();

		for (int i = 0; i < instances.size(); i++) {
			double singleInstFirstTimeStamp = Calendar.getInstance()
					.getTimeInMillis();

			//Create a Pattern and a Matcher object. Note, that these are objects required 
			//by the regex engine
			Pattern pattern = Pattern.compile(instances.get(i)[0]);
			Matcher matcher = pattern.matcher(instances.get(i)[1]);

			writer.println("Solve Instance");
			writer.println(instances.get(i)[0]);
			writer.println(instances.get(i)[1]);

			System.out.println("Solve Instance");
			System.out.println(instances.get(i)[0]);
			System.out.println(instances.get(i)[1]);

			if (matcher.find()) {
				System.out.println("This instance is a member.");
				writer.println("POSITIVE");
			} 
			else 
			{
				System.out.println("This instance is not a member.");
				writer.println("NEGATIVE");
			}

			double singleInstSecondTimeStamp = Calendar.getInstance()
					.getTimeInMillis();

			double singleInstSeconds = ((singleInstSecondTimeStamp - singleInstFirstTimeStamp) / 1000);

			System.out.println("Time: " + singleInstSeconds);
			System.out.println("");

			writer.println("Time: " + singleInstSeconds);
			writer.println("");

		}

		double secondTimeStamp = Calendar.getInstance().getTimeInMillis();

		System.out.println("DONE");

		double completeSeconds = ((secondTimeStamp - firstTimeStamp) / 1000);

		System.out.println("Complete time: " + completeSeconds);
		writer.println("Complete time: " + completeSeconds);

		writer.flush();

	}

	public void run() {
		isMember = solveInstance(regexPattern, regexMatcher);
	}

}
